<?php
/*
 * $Id: LoggingObject.class.php 220 2009-10-28 02:58:23Z takuji.mezawa $
 * 
 * (C) 2009, Mezawa Takuji, EzoGP (http://ezogp.sourceforge.jp/).
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// オブジェクト参照定義
require_once LOG4PHP_DIR."/LoggerManager.php";

/**
 * SyracavaPHP標準のロギングクラス。
 * 
 * NOTE log4phpに依存している、Singletonモデルのクラスです。
 * 
 * @author     $Author: takuji.mezawa $  (EzoGP)
 * @version    $Revision: 220 $, SyracavaPHP 0.1
 * @package    common
 * @subpackage *
 */
class LoggingObject {
    private static $log      = null;        // log4php ロガー
    private static $instance = null;        // 自身のインスタンス
    private static $typename = __CLASS__;   // 自身のクラス名
    
    const DUMMY    = "dummy";               // 利用者（ユーザーID）が得られなかったときのダミー
    const CATEGORY = "SyracavaPHP";         // SyracavaPHPカテゴリー名
    
    /**
     * コンストラクタ。
     * 
     * @see LogSupport::getLogger()
     * @param string $category　ロギングカテゴリー名。default=SyracavaPHP。
     */
    private function __construct($category=self::CATEGORY) {
        $_uid    = LocalSession::getAttribute("userId");
        $_userId = (strlen($_uid) > 0) ? $_uid : DUMMY;
        LoggerMDC::put("USER", $_userId);
        
        $this->log =& LoggerManager::getLogger($category);
    }
    
    /**
     * 指定のカテゴリーのロガーを提供する。
     * 
     * 以下のロギング開始準備を行った上で、ロガー提供をする。
     * <pre>
     *   ・リモートアドレスの取得
     *   ・リモートホストの取得
     *   ・リクエストユーザーの取得
     *   ・上記３情報をロギングメッセージ埋め込むためのMDC設定
     * </pre>
     * 
     * @param string $category ロギングカテゴリー名
     * @return LogSupport 本クラスのインスタンス
     */
    public static function &getLogger($category=null) {
        return ($category == null) ?
            new LoggingObject() :
            new LoggingObject($category) ;
    }
    
    /**
     * ロギング処理を終了する。
     */
    public function end() {
        $this->log->shutdown();
    }
    
    /**
     * メソッドの開始マークアップをする。
     * 
     * @param string $method メソッド名
     */
    public function start($method) {
        $this->info("**[ {$method}()");
    }
    
    /**
     * メソッドの終了マークアップをする。
     * 
     * @param string $method メソッド名
     */
    public function finish($method) {
        $this->info("]** {$method}()");
    }
    
    /**
     * DEBUGレベルのログメッセージを出力する。
     * 出力するかどうかは、出力可能レベルの判定をした上で行う。
     * 
     * @param string $message ログメッセージ
     * @param Exception $ex 例外オブジェクト（デフォルト＝ヌル）
     */
    public function debug($message, Exception $ex=null) {
        if ($this->log->isDebugEnabled()) {
            if ($ex != null) {
                $this->log->debug(sprintf("%d: %s\n%s", $ex->getCode(), $ex->getMessage(), $ex->getTrace()));
            }
            $this->log->debug($message);
        }
    }
    
    /**
     * INFOレベルのログメッセージを出力する。
     * 出力するかどうかは、出力可能レベルの判定をした上で行う。
     * 
     * @param string $message INFOメッセージ
     * @param Exception $ex 例外オブジェクト（デフォルト＝ヌル）
     */
    public function info($message, Exception $ex=null) {
        if ($this->log->isInfoEnabled()) {
            if ($ex != null) {
                $this->log->info(sprintf("%d: %s\n%s", $ex->getCode(), $ex->getMessage(), $ex->getTrace()));
            }
            $this->log->info($message);
        }
    }
    
    /**
     * WARNレベルのログメッセージを出力する。
     * 出力するかどうかは、出力可能レベルの判定をした上で行う。
     * 
     * @param string $message WARNメッセージ
     * @param Exception $ex 例外オブジェクト（デフォルト＝ヌル）
     */
    public function warn($message, Exception $ex=null) {
        if ($this->log->isEnabledFor(LoggerLevel::getLevelWarn())) {
            if ($ex != null) {
                $this->log->warn(sprintf("%d: %s\n%s", $ex->getCode(), $ex->getMessage(), $ex->getTrace()));
            }
            $this->log->warn($message);
        }
    }
    
    /**
     * ERRORレベルのログメッセージを出力する。
     * 出力するかどうかは、出力可能レベルの判定をした上で行う。
     * 
     * @param string $message ERRORメッセージ
     * @param Exception $ex 例外オブジェクト（デフォルト＝ヌル）
     */
    public function error($message, Exception $ex=null) {
        if ($this->log->isEnabledFor(LoggerLevel::getLevelError())) {
            if ($ex != null) {
                $this->log->error(sprintf("%d: %s\n%s", $ex->getCode(), $ex->getMessage(), $ex->getTrace()));
            }
            $this->log->error($message);
        }
    }
    
    /**
     * FATALレベルのログメッセージを出力する。
     * 出力するかどうかは、出力可能レベルの判定をした上で行う。
     * 
     * @param string $message FATALメッセージ
     * @param Exception $ex 例外オブジェクト（デフォルト＝ヌル）
     */
    public function fatal($message, Exception $ex=null) {
        if ($this->log->isEnabledFor(LoggerLevel::getLevelFatal())) {
            if ($ex != null) {
                $this->log->fatal(sprintf("%d: %s\n%s", $ex->getCode(), $ex->getMessage(), $ex->getTrace()));
            }
            $this->log->fatal($message);
        }
    }
}
?>